package net.wofly.right.shiro;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager;
import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
import org.apache.shiro.web.servlet.AbstractShiroFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import net.wofly.right.domain.FuncInit;
import net.wofly.right.service.IFuncInitService;

/**
 * 热加载链接权限s
 * 2017年2月15日 下午4:16:07
 */
@Service
public class ShiroService {
    
    @Autowired
    ShiroFilterFactoryBean shiroFilterFactoryBean;
    @Autowired
    IFuncInitService iFuncInitService;
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    /**
     * 初始化权限
     */
    public Map<String, String> loadFilterChainDefinitions() {
        // 权限控制map.从数据库获取
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
        List<FuncInit> list = iFuncInitService.findAll();
        
        for (FuncInit funcInit : list) {
            filterChainDefinitionMap.put(funcInit.getFuncUrl(), funcInit.getPermissionInit());
        }
        
        return filterChainDefinitionMap;
    }
    
    /**
     * 重新加载权限
     */
    public void updateInitPermission() {
        
        synchronized (shiroFilterFactoryBean) {
            
            AbstractShiroFilter shiroFilter = null;
            try {
                shiroFilter = (AbstractShiroFilter) shiroFilterFactoryBean.getObject();
            } catch (Exception e) {
                throw new RuntimeException("get ShiroFilter from shiroFilterFactoryBean error!");
            }
            
            PathMatchingFilterChainResolver filterChainResolver = (PathMatchingFilterChainResolver) shiroFilter
                    .getFilterChainResolver();
            DefaultFilterChainManager manager = (DefaultFilterChainManager) filterChainResolver.getFilterChainManager();
            
            // 清空老的权限控制
            manager.getFilterChains().clear();
            
            shiroFilterFactoryBean.getFilterChainDefinitionMap().clear();
            shiroFilterFactoryBean.setFilterChainDefinitionMap(loadFilterChainDefinitions());
            // 重新构建生成
            Map<String, String> chains = shiroFilterFactoryBean.getFilterChainDefinitionMap();
            for (Map.Entry<String, String> entry : chains.entrySet()) {
                String url = entry.getKey();
                String chainDefinition = entry.getValue().trim().replace(" ", "");
                manager.createChain(url, chainDefinition);
            }
            
            logger.info(">>>更新权限成功！！");
        }
    }
}
